package ctx

import (
	"context"
	"net/url"

	"gitee.com/shoyer/framework/ctx/session"
	"gitee.com/shoyer/framework/enums/Encode"
	"gitee.com/shoyer/framework/enums/RenderType"
)

type Ctx struct {
	context.Context
	locale  string
	ip      string
	session session.Session
	data    map[string]interface{} // 存放任意自定义数据
	params  url.Values

	// 输出数据格式，现在由服务器根据api使用的场景强制决定，留有扩展空间，以后可以支持多种格式，可以由客户端决定输出格式(在服务器支持的范围内选择)
	// 优先从url里解析r参数
	// 其次从header里解析r参数
	renderType RenderType.RenderTypeEnum
	encode     Encode.EncodeEnum
}

func (c *Ctx) SetLocale(locale string) *Ctx {
	c.locale = locale
	return c
}

func (c *Ctx) GetLocale() string {
	return c.locale
}

func (c *Ctx) GetIP() string {
	return c.ip
}

func (c *Ctx) SetIP(ip string) *Ctx {
	c.ip = ip
	return c
}

func (c *Ctx) SetSession(s session.Session) *Ctx {
	c.session = s
	return c
}

func (c *Ctx) GetSession() *session.Session {
	return &c.session
}

func (c *Ctx) Get(key string) interface{} {
	if c.data == nil {
		return nil
	}

	return c.data[key]
}

func (c *Ctx) Set(key string, value interface{}) *Ctx {
	if c.data == nil {
		c.data = make(map[string]interface{})
	}

	c.data[key] = value
	return c
}

func (c *Ctx) GetParam(key string) string {
	if c.params == nil {
		return ""
	}

	return c.params.Get(key)
}

func (c *Ctx) SetParams(p url.Values) *Ctx {
	c.params = p
	return c
}

func (c *Ctx) SetRenderType(typ RenderType.RenderTypeEnum) *Ctx {
	c.renderType = typ
	return c
}

func (c *Ctx) GetRenderType() RenderType.RenderTypeEnum {
	return c.renderType
}

func (c *Ctx) RenderJson() *Ctx {
	c.renderType = RenderType.Json
	return c
}

func (c *Ctx) RenderText() *Ctx {
	c.renderType = RenderType.Text
	return c
}

func (c *Ctx) RenderProto() *Ctx {
	c.renderType = RenderType.Proto
	return c
}

func (c *Ctx) RenderTemplate() *Ctx {
	c.renderType = RenderType.Template
	return c
}

func (c *Ctx) SetEncode(encode Encode.EncodeEnum) *Ctx {
	c.encode = encode
	return c
}

func (c *Ctx) GetEncode() Encode.EncodeEnum {
	return c.encode
}
